#include <REGX52.H>
#include<intrins.h>

#define DS1302_SECOND  	0x80  
#define DS1302_MINUTE  	0x82
#define DS1302_HOUR  		0x84
#define DS1302_DATE  		0x86
#define DS1302_MONTH  	0x88
#define DS1302_DAY  		0x8A
#define DS1302_YEAR  		0x8C
#define DS1302_WP  			0x8E  //写保护

sbit DS1302_SCLK = P3^6;
sbit DS1302_IO = P3^4;
sbit DS1302_CE = P3^5;

//把数组声明为外部可调用的，此数组为存年月，日，时，分，秒，星期
extern char DS1302_Time[] = {22,5,5,23,59,55,2};
//星期取值范围为1到7，分别代表周一到周末，但是数组索引和星期对应关系为i%7


/**
  * @brief  初始化DS1302
  */
void DS1302_Init()
{
	DS1302_CE = 0;
	DS1302_SCLK = 0;
}

/**
  * @brief  往DS1302中写数据，写之前记得关闭写保护
  * @param  Command 命令字，表示写哪个寄存器(年月日时分秒星期)
	* @param  Data  要写入的数据
  * @retval 无
  */
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE = 1;
	for(i=0;i<8;i++)
	{
		DS1302_IO = Command&(0x01<<i);
		DS1302_SCLK = 1;
		DS1302_SCLK = 0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO = Data&(0x01<<i);
		DS1302_SCLK = 1;
		DS1302_SCLK = 0;
	}
	
//	DS1302_CE = 0;
}


/**
  * @brief  从DS1302中读取数据
  * @param  Command 命令字，表示读取哪个寄存器(年月日时分秒星期)
  * @retval 返回读取的数据，已经进行了从BCD码到十进制码的转换
  */
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Tmp,Data=0x00;
	
	//加上这个，输入的Command为写的就行，可以减少宏定义数量
	Command |= 0x01; 
	DS1302_CE = 0;
	_nop_();
	DS1302_SCLK = 0;
	_nop_();
	DS1302_CE = 1;
	_nop_();
	
	for(i=0;i<8;i++)
	{
		DS1302_IO = Command&(0x01<<i);
		DS1302_SCLK = 1;
		_nop_();
		DS1302_SCLK = 0;
		_nop_();
	}
	_nop_();
	
	for(i=0;i<8;i++)
	{
		if(DS1302_IO){Data|=(0x01<<i);}
		DS1302_SCLK = 1;
		_nop_();
		DS1302_SCLK = 0;
		_nop_();
	}
	
//	DS1302_CE = 0; //温度注解
	_nop_();
	DS1302_SCLK = 1;
	_nop_();
	DS1302_IO =0;
	_nop_();
	DS1302_IO =1;
	_nop_();
	Tmp = Data/16*10+Data%16;
	return Tmp;
}



/**
  * @brief  把自定义数组里的数据分别写入对应的DS1302中
  * @param  无
  * @retval 无
  */
void DS1302_SetTime()
{
	//关闭写保护


	DS1302_WriteByte(DS1302_WP,0x00);
	DS1302_WriteByte(DS1302_YEAR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MONTH,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_DATE,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[3]/10*16+DS1302_Time[3]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[4]/10*16+DS1302_Time[4]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[5]/10*16+DS1302_Time[5]%10);
	DS1302_WriteByte(DS1302_DAY,DS1302_Time[6]/10*16+DS1302_Time[6]%10);
	DS1302_WriteByte(DS1302_WP,0x80);
}

/**
  * @brief  从DS1302中读取对应数据到自定义数组
  * @param  无
  * @retval 无
  */
void DS1302_ReadTime()
{
	DS1302_Time[0] = DS1302_ReadByte(DS1302_YEAR);
	DS1302_Time[1] = DS1302_ReadByte(DS1302_MONTH);
	DS1302_Time[2] = DS1302_ReadByte(DS1302_DATE);
	DS1302_Time[3] = DS1302_ReadByte(DS1302_HOUR);
	DS1302_Time[4] = DS1302_ReadByte(DS1302_MINUTE);
	DS1302_Time[5] = DS1302_ReadByte(DS1302_SECOND);
	DS1302_Time[6] = DS1302_ReadByte(DS1302_DAY);

}


/**
  * @brief  根据年月日的变化获取星期
	* @retval 获取的为星期几，但是这个和数组下标对应，星期日为0
  */
int WeekSet()
{
	int c,y,m,d,w;
	c = 20;
	y = DS1302_Time[0];
	m = DS1302_Time[1];
	d = DS1302_Time[2];
	w=y+(y/4)+(c/4)-2*c+(26*(m+1)/10)+d-1;
	DS1302_Time[6] = w%7;
	return w;
}


	